package com.joolun.weixin.service;


import com.baomidou.mybatisplus.extension.service.IService;
import com.joolun.system.domain.ScrmCustomerInfo;
import com.joolun.weixin.entity.dto.WxCpXmlOutMessageDTO;
import com.joolun.weixin.entity.dto.WxStaffDeleteCustomerDTO;
import me.chanjar.weixin.common.error.WxErrorException;
import me.chanjar.weixin.cp.bean.external.WxCpUpdateRemarkRequest;
import me.chanjar.weixin.cp.bean.external.contact.WxCpExternalContactBatchInfo;
import org.redisson.api.RLock;

import java.util.List;


/**
 * 企业微信客户详情信息 服务类
 * @author xxh
 * @since 2021-12-22
 */
public interface IScrmCustomerInfoService extends IService<ScrmCustomerInfo> {

    /**
     * 查询客户详情信息（会查出被删除的数据）
     * @param extCorpId 外部企业ID
     * @param customerExtId 客户extId
     * @param staffExtId 员工extId
     * @return 客户信息
     */
    ScrmCustomerInfo find(String extCorpId, String customerExtId, String staffExtId);

    /**
     * 查询企业微信客户详情信息
     *
     * @param id 企业微信客户详情信息主键
     * @return 企业微信客户详情信息
     */
    public ScrmCustomerInfo selectScrmCustomerInfoById(Integer id);

    /**
     * 查询企业微信客户详情信息列表
     *
     * @param scrmCustomerInfo 企业微信客户详情信息
     * @return 企业微信客户详情信息集合
     */
    public List<ScrmCustomerInfo> selectScrmCustomerInfoList(ScrmCustomerInfo scrmCustomerInfo);

    /**
     * 新增企业微信客户详情信息
     *
     * @param scrmCustomerInfo 企业微信客户详情信息
     * @return 结果
     */
    public int insertScrmCustomerInfo(ScrmCustomerInfo scrmCustomerInfo);

    /**
     * 修改企业微信客户详情信息
     *
     * @param scrmCustomerInfo 企业微信客户详情信息
     * @return 结果
     */
    public int updateScrmCustomerInfo(ScrmCustomerInfo scrmCustomerInfo);

    /**
     * 批量删除企业微信客户详情信息
     *
     * @param ids 需要删除的企业微信客户详情信息主键集合
     * @return 结果
     */
    public int deleteScrmCustomerInfoByIds(Integer[] ids);

    /**
     * 删除企业微信客户详情信息信息
     *
     * @param id 企业微信客户详情信息主键
     * @return 结果
     */
    public int deleteScrmCustomerInfoById(Integer id);


    /**
     * 删除客户
     * @param customerDTO
     */
    void staffDeleteCustomer(WxStaffDeleteCustomerDTO customerDTO);


    /**
     * 释放锁
     *
     * @param rLock
     */
    void releaseSyncLock(RLock rLock);

    /**
     * 获取客户同步信息的锁
     *
     * @param extCorpId
     * @param extId
     * @return
     */
    RLock getCustomerSyncLock(String extCorpId, String extId);

    /**
     * 尝试锁
     *
     * @param rLock
     * @return
     */
    boolean trySyncLock(RLock rLock) throws InterruptedException;

    /**
     * 刷新客户信息
     *
     * @param externalContactInfo
     * @param dto
     * @return
     */
    ScrmCustomerInfo refreshCustomer(WxCpExternalContactBatchInfo.ExternalContactInfo externalContactInfo, WxCpXmlOutMessageDTO dto);

    ScrmCustomerInfo checkExists(String extCorpId, String extId);



    /**
     * 特殊的检查这个客户在不在（事务传播特性不一样）
     *
     * @param extCorpId
     * @param extCustomerId
     * @return
     */
    boolean countByCustomerId(String extCorpId, String extCustomerId);


    /**
     * 获取所有客户的extId
     *
     * @return
     */
    List<String> getAllExtId();

    /**
     * 获取客户同步信息的锁
     *
     * @param extCorpId
     * @return
     */
    List<RLock> getCustomerSyncLock(String extCorpId);


    /**
     * 获取客户同步信息的锁
     *
     * @param extCorpId
     * @param needCache 是否需要缓存
     * @return
     */
    List<RLock> getCustomerSyncLock(String extCorpId, boolean needCache);


    /**
     * 更新客户备注
     * @param wxCpUpdateRemarkRequest
     * @param extCorpId
     * @throws WxErrorException
     */
    void updateRemark(WxCpUpdateRemarkRequest wxCpUpdateRemarkRequest, String extCorpId) throws WxErrorException;

    /**
     * 更新入群标志
     * @param userIds
     * @param owner
     * @return
     */
    int updateJoinGrop(List<String> userIds,String owner);
}
